package com.extension.company.common.http;

import android.net.ParseException;

import com.google.gson.JsonParseException;

import org.apache.http.conn.ConnectTimeoutException;
import org.json.JSONException;

import java.net.ConnectException;

import retrofit2.HttpException;

/**
 * 作者：zwk
 * 时间：on 2019/3/13 10:33
 * 功能：异常错误的处理
 */
public class ExceptionHandle {

	/**
	 * 未授权
	 */
	private static final int UNAUTHORIZED = 401;
	/**
	 *
	 */
	private static final int FORBIDDEN = 403;
	/**
	 *
	 */
	private static final int NOT_FOUND = 404;
	/**
	 *
	 */
	private static final int REQUEST_TIMEOUT = 408;
	/**
	 *
	 */
	private static final int INTERNAL_SERVER_ERROR = 500;
	/**
	 *
	 */
	private static final int BAD_GATEWAY = 502;
	/**
	 *
	 */
	private static final int SERVICE_UNAVAILABLE = 503;
	/**
	 *
	 */
	private static final int GATEWAY_TIMEOUT = 504;

	public static ResponeThrowable handleException(Throwable e) {
		ResponeThrowable ex;
		if (e instanceof HttpException) {
			HttpException httpException = (HttpException) e;
			ex = new ResponeThrowable(e, ERROR.HTTP_ERROR);
			switch (httpException.code()) {
				case UNAUTHORIZED:
				case FORBIDDEN:
				case NOT_FOUND:
				case REQUEST_TIMEOUT:
				case GATEWAY_TIMEOUT:
				case INTERNAL_SERVER_ERROR:
				case BAD_GATEWAY:
				case SERVICE_UNAVAILABLE:
				default:
					ex.message = "网络错误";
					break;
			}
			return ex;
		} else if (e instanceof ServerException) {
			ServerException resultException = (ServerException) e;
			ex = new ResponeThrowable(resultException, resultException.code);
			ex.message = resultException.message;
			return ex;
		} else if (e instanceof JsonParseException
				|| e instanceof JSONException
				|| e instanceof ParseException) {
			ex = new ResponeThrowable(e, ERROR.PARSE_ERROR);
			ex.message = "解析错误";
			return ex;
		} else if (e instanceof ConnectException) {
			ex = new ResponeThrowable(e, ERROR.NETWORD_ERROR);
			ex.message = "连接失败";
			return ex;
		} else if (e instanceof javax.net.ssl.SSLHandshakeException) {
			ex = new ResponeThrowable(e, ERROR.SSL_ERROR);
			ex.message = "证书验证失败";
			return ex;
		} else if (e instanceof ConnectTimeoutException) {
			ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);
			ex.message = "连接超时";
			return ex;
		} else if (e instanceof java.net.SocketTimeoutException) {
			ex = new ResponeThrowable(e, ERROR.TIMEOUT_ERROR);
			ex.message = "连接超时";
			return ex;
		} else if (e instanceof java.net.UnknownHostException) {
			ex = new ResponeThrowable(e, ERROR.UN_KNOWN_HOST_ERROR);
			ex.message = "无网络";
			return ex;
		} else {
			ex = new ResponeThrowable(e, ERROR.UNKNOWN);
			ex.message = "未知错误";
			return ex;
		}
	}


	/**
	 * 约定异常
	 */
	class ERROR {
		/**
		 * 未知错误
		 */
		public static final int UNKNOWN = 1000;
		/**
		 * 解析错误
		 */
		public static final int PARSE_ERROR = 1001;
		/**
		 * 网络错误
		 */
		public static final int NETWORD_ERROR = 1002;
		/*
		 * 协议出错
		 */
		public static final int HTTP_ERROR = 1003;

		/**
		 * 证书出错
		 */
		public static final int SSL_ERROR = 1005;

		/**
		 * 连接超时
		 */
		public static final int TIMEOUT_ERROR = 1006;

		/*
		 * 网络主机不可达
		 */
		public static final int UN_KNOWN_HOST_ERROR = 1007;
	}

	/**
	 * 网络错误
	 */
	public static class ResponeThrowable extends Exception {
		public int code;
		public String message;

		public ResponeThrowable(Throwable throwable, int code) {
			super(throwable);
			this.code = code;
		}
	}

	/**
	 * 服务器错误
	 */
	public class ServerException extends RuntimeException {
		public int code;
		public String message;
	}
}
